#ifndef INPUTPARSER_H
#define INPUTPARSER_H
#define DEBUG 0
#include<iostream>
using std::cout;using std::endl; using std::string;
#include<vector>
using std::vector;
#include <stack>
using std::stack;
#include<algorithm>
#include<memory>
using std::shared_ptr; using std::make_shared;

class TextQuery;
class Query;
class InputParser{
    public:
        InputParser(TextQuery &tq);
        void execQueries(string);
    private:
        TextQuery &tq_;
        shared_ptr<vector<string>> suffix_;
        shared_ptr<stack<char>> opstack_;
        string inq_;
        
        shared_ptr<vector<string>> makeSuffix(const string&);   //将中缀表达式的输入转为后缀表达式形式
        Query execSuffix(vector<string>&);  //执行后缀表达式
        string& refreshInp(string&);           //每次输入都要刷新相关数据结构
        bool checkInp(const string&);       //输入验证
        bool chkOp(const char&);            //检查运算符
        bool chkBrk(const string&);         //检查括号匹配
        void processOp(const char&);          //处理后缀表达式生成过程中的运算符
        int cmpOp(const char&,const char&); //比较运算符优先级
        Query cal(const Query&,const string&,const Query&); //对Query根据算符作对应结合运算

        //fun for debug
        void suffixDebug();
        void execDebug();
        void printSuffix();
        void printOpStack();
};


#endif  //InputParser_H
